home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Very Best of Atari Inside
/
The Very Best of Atari Inside 1.iso
/
mint
/
mntlib43
/
mntlib
/
grp.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-07-06
|
4KB
|
203 lines
/*
* Routines for reading information from /etc/group.
* Written by Eric Smith, based on Arnold Robbins' public domain
* getpwent routines (see getpw.c).
*/
/*
Revised by Hildo Biersma (boender@dutiws.twi.tudelft.nl)
Revision 1 (January 31, 1993): include fgetgrent()
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <grp.h>
static char *grpfile = "/etc/group"; /* default group file */
static FILE *fp;
static struct group curentry; /* static data to return */
static int nextent __PROTO((FILE *fp));
/* Rewind the group file to allow repeated searches */
void setgrent()
{
if (fp != NULL)
rewind (fp);
else if ((fp = fopen (grpfile, "rt")) == NULL)
{
#ifdef VERBOSE
fprintf (stderr,
"setgrent: %s non-existant or unreadable.\n", grpfile);
#endif
}
} /* End of setgrent() */
/* Close the group file when processing is complete */
void endgrent()
{
if (fp != NULL)
{
fclose (fp);
fp = NULL;
}
} /* End of endgrent() */
/* Get the next group structure in the file */
struct group *getgrent()
{
if (fp == NULL)
setgrent();
if (fp == NULL)
return NULL;
if (nextent(fp) == 0)
return(NULL);
else
return(&curentry);
} /* End of getgrent() */
/* Get first group with matching numerical group ID from file */
struct group *getgrgid(gid)
int gid;
{
setgrent();
while (nextent(fp) != 0)
if (curentry.gr_gid == gid)
return(&curentry);
return(NULL);
} /* End of getgrid() */
/* Get first group with matching group name from file */
struct group *getgrnam(name)
const char *name;
{
setgrent();
while (nextent(fp) != 0)
if (strcmp (curentry.gr_name, name) == 0)
return (&curentry);
return(NULL);
} /* End of getgrnam() */
/* Read the next group structure from a given file */
struct group *fgetgrent(f)
FILE *f;
{
if (f == NULL)
return(NULL); /* Failure */
if (nextent(f) != 0)
return(&curentry); /* Success */
return(NULL); /* Failure */
} /* End of fgetgrent() */
#define MAX_MEMBERS 128 /* max. number of members in a group */
static char savbuf[512];
static char *memb[MAX_MEMBERS];
static int nextent(fp)
FILE *fp;
{
register char *cp;
register int i;
if (fp == NULL)
setgrent();
if (fp == NULL)
return(0);
if (fgets(savbuf, (int)sizeof(savbuf), fp) != NULL)
{
for (cp = savbuf; *cp && *cp != ':'; cp++)
;
curentry.gr_name = savbuf;
*cp++ = 0x00;
curentry.gr_passwd = cp;
for (; *cp && *cp != ':'; cp++)
;
*cp++ = 0x00;
curentry.gr_gid = atoi (cp);
for (; *cp && *cp != ':'; cp++)
;
*cp++ = 0x00;
i = 0;
while( *cp )
{
if (i >= MAX_MEMBERS-1)
break;
for (; *cp == ' '; cp++)
;
memb[i++] = cp;
for(; *cp && *cp != ',' && *cp != '\n'; cp++)
;
if (*cp == '\n')
*cp = 0;
else if (*cp)
*cp++ = 0;
}
memb[i] = NULL;
curentry.gr_mem = memb;
return(1);
}
return(0);
} /* End of nextent() */
#ifdef TEST
int
main (argc, argv)
int argc;
char **argv;
{
struct group *gr;
char **m;
if (argc > 1) {
grpfile = argv[1];
}
setgrent ();
while ((gr = getgrent ()) != NULL)
{
printf ("%s:[%s] %d\n",
gr->gr_name,
gr->gr_passwd,
gr->gr_gid);
for (m = gr->gr_mem; *m; m++) {
printf("\t%s\n", *m);
}
}
endgrent ();
if (gr = getgrnam ("mail")) {
printf ("%s:[%s] %d\n",
gr->gr_name,
gr->gr_passwd,
gr->gr_gid);
for (m = gr->gr_mem; *m; m++) {
printf("\t%s\n", *m);
}
}
if (gr = getgrgid (1)) {
printf ("%s:[%s] %d\n",
gr->gr_name,
gr->gr_passwd,
gr->gr_gid);
for (m = gr->gr_mem; *m; m++) {
printf("\t%s\n", *m);
}
}
return 0;
}
#endif